--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit bf5ad24733f5fe706cfd7581af3d495249e0a9d5
Parents : 4fc80c2
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-22T20:11:34-05:00
feat(locales): update tile server URL and add Sieve Filters localization for multiple languages
Changes
8 files changed, 440 insertions(+), 8 deletions(-)
Diff
diff --git a/meshchatx/src/frontend/locales/de.json b/meshchatx/src/frontend/locales/de.json
index 2c6261b3..d07a6da0 100644
--- a/meshchatx/src/frontend/locales/de.json
+++ b/meshchatx/src/frontend/locales/de.json
@@ -855,7 +855,7 @@
"clear_cache": "Cache leeren",
"cache_cleared": "Kachel-Cache geleert",
"tile_server_url": "Kachel-Server-URL",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Verwenden Sie {z}, {x}, {y} für Zoom, Spalte, Zeile",
"tile_server_saved": "Kachel-Server-URL gespeichert",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1282,6 +1282,60 @@
"title": "Weiterleiter",
"description": "LXMF zwischen Adressen weiterleiten, mit erhaltenem Antwort-Routing."
},
+ "sieve_filters": {
+ "title": "Sieb-Filter",
+ "description": "Text in Peer-Feldern und/oder Nachrichtentitel und -inhalt abgleichen, dann Unterhaltung ausblenden, Benachrichtigungen stellen, Ordner zuweisen oder Absender vollständig blockieren (verbannen).",
+ "subtitle": "Regeln laufen der Reihe nach. Der Geltungsbereich wählt alle, nur Kontakte oder nur Nicht-Kontakte. Teilstring- oder Regex-Abgleich. Die erste passende aktive Regel gewinnt.",
+ "back_tools": "Zurück zu Werkzeugen",
+ "rules_heading": "Regeln",
+ "add_rule": "Regel hinzufügen",
+ "order_hint": "Reihenfolge von oben nach unten: die erste passende Regel zählt.",
+ "empty_rules": "Noch keine Regeln. Fügen Sie eine Regel hinzu oder speichern Sie eine leere Liste zum Zurücksetzen.",
+ "enabled": "Aktiv",
+ "move_up": "Nach oben",
+ "move_down": "Nach unten",
+ "remove_rule": "Regel entfernen",
+ "terms_label": "Begriffe oder Muster",
+ "terms_placeholder": "Eine Zeile pro Eintrag oder kommagetrennt. Teilstrings ohne Groß/Klein. Regex: ein Muster pro Zeile; ungültige Muster werden beim Speichern entfernt.",
+ "match_targets_label": "Abgleich in",
+ "match_peer_fields": "Peer-Anzeigename, eigener Name, Kontaktfelder",
+ "match_message": "Nachrichtentitel und -inhalt (wenn vorhanden)",
+ "match_targets_hint": "Mindestens ein Ziel muss aktiv bleiben.",
+ "match_mode_label": "Abgleichart",
+ "match_mode_substring": "Teilzeichenkette",
+ "match_mode_regex": "Regulärer Ausdruck",
+ "scope_label": "Gilt für",
+ "scope_everyone": "Alle",
+ "scope_contacts": "Nur Kontakte",
+ "scope_non_contacts": "Nur Nicht-Kontakte",
+ "graph_scope_everyone": "Alle",
+ "graph_scope_contacts": "Kontakte",
+ "graph_scope_non_contacts": "Unbekannte",
+ "graph_match_peer": "Peer",
+ "graph_match_message": "Nachr.",
+ "graph_match_mode_substring": "Teilstr.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Dann",
+ "action_hide": "Unterhaltung ausblenden",
+ "action_ignore": "Ignorieren (keine Benachrichtigungen)",
+ "action_folder": "In Ordner verschieben",
+ "action_banish": "Absender verbannen (vollständige Sperre)",
+ "folder_label": "Ordner",
+ "save": "Speichern",
+ "saving": "Speichern…",
+ "revert": "Neu laden",
+ "saved": "Sieb-Filter gespeichert",
+ "save_failed": "Sieb-Filter konnten nicht gespeichert werden",
+ "load_failed": "Sieb-Filter konnten nicht geladen werden",
+ "flow_heading": "Regelablauf",
+ "flow_source": "Peers",
+ "flow_source_hint": "Peer-Felder: angekündigter Name, eigener Anzeigename, Kontaktname oder LXMF-Adresse.",
+ "flow_if": "Wenn",
+ "flow_hide": "Ausblenden",
+ "flow_banish": "Verbannen",
+ "flow_folder": "Ordner",
+ "flow_no_rules": "Keine Regeln"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "RNode-Firmware im Browser flashen oder aktualisieren (unterstützte Hardware).",
diff --git a/meshchatx/src/frontend/locales/en.json b/meshchatx/src/frontend/locales/en.json
index 14b09c73..8367963d 100644
--- a/meshchatx/src/frontend/locales/en.json
+++ b/meshchatx/src/frontend/locales/en.json
@@ -803,7 +803,7 @@
"clear_cache": "Clear Cache",
"cache_cleared": "Tile cache cleared",
"tile_server_url": "Tile Server URL",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Use {z}, {x}, {y} for zoom, column, row",
"tile_server_saved": "Tile server URL saved",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1342,6 +1342,60 @@
"title": "Forwarder",
"description": "Forward LXMF between addresses with reply routing preserved."
},
+ "sieve_filters": {
+ "title": "Sieve filters",
+ "description": "Match text in peer identity fields and/or message title and body, then hide the thread, silence notifications, move it to a folder, or banish the sender (full block).",
+ "subtitle": "Rules run in order. Scope picks everyone, contacts only, or non-contacts only. Choose substring or regex matching. The first enabled rule whose scope fits and whose targets match wins.",
+ "back_tools": "Back to tools",
+ "rules_heading": "Rules",
+ "add_rule": "Add rule",
+ "order_hint": "Drag order is top to bottom: the first matching rule applies.",
+ "empty_rules": "No rules yet. Add a rule or save an empty list to clear filters.",
+ "enabled": "Enabled",
+ "move_up": "Move up",
+ "move_down": "Move down",
+ "remove_rule": "Remove rule",
+ "terms_label": "Terms or patterns",
+ "terms_placeholder": "One per line or comma-separated. Substrings are case-insensitive. Regex: one pattern per line; invalid patterns are removed when saving.",
+ "match_targets_label": "Match in",
+ "match_peer_fields": "Peer display name, custom name, contact fields",
+ "match_message": "Message title and body (when available)",
+ "match_targets_hint": "At least one target must stay enabled.",
+ "match_mode_label": "Match style",
+ "match_mode_substring": "Substring",
+ "match_mode_regex": "Regular expression",
+ "scope_label": "Applies to",
+ "scope_everyone": "Everyone",
+ "scope_contacts": "Contacts only",
+ "scope_non_contacts": "Non-contacts only",
+ "graph_scope_everyone": "Everyone",
+ "graph_scope_contacts": "Contacts",
+ "graph_scope_non_contacts": "Non-contacts",
+ "graph_match_peer": "peer",
+ "graph_match_message": "msg",
+ "graph_match_mode_substring": "substring",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Then",
+ "action_hide": "Hide conversation",
+ "action_ignore": "Ignore (no notifications)",
+ "action_folder": "Move to folder",
+ "action_banish": "Banish sender (full block)",
+ "folder_label": "Folder",
+ "save": "Save",
+ "saving": "Saving…",
+ "revert": "Reload",
+ "saved": "Sieve filters saved",
+ "save_failed": "Could not save sieve filters",
+ "load_failed": "Could not load sieve filters",
+ "flow_heading": "Rule flow",
+ "flow_source": "Peers",
+ "flow_source_hint": "Peer fields use announced display name, your custom name, and contact name or LXMF address.",
+ "flow_if": "If",
+ "flow_hide": "Hide",
+ "flow_banish": "Banish",
+ "flow_folder": "Folder",
+ "flow_no_rules": "No rules"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Flash or update RNode firmware from the browser (supported hardware).",
diff --git a/meshchatx/src/frontend/locales/es.json b/meshchatx/src/frontend/locales/es.json
index 07c70b4d..d7636434 100644
--- a/meshchatx/src/frontend/locales/es.json
+++ b/meshchatx/src/frontend/locales/es.json
@@ -803,7 +803,7 @@
"clear_cache": "Caché transparente",
"cache_cleared": "Caché de azul claro",
"tile_server_url": "URL del servidor",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Utilice{z},{x},{y}para zoom, columna, fila",
"tile_server_saved": "URL del servidor del azul",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1342,6 +1342,60 @@
"title": "Forwarder",
"description": "Forward LXMF entre direcciones con réplica conservado."
},
+ "sieve_filters": {
+ "title": "Filtros tamiz",
+ "description": "Coincidir texto en datos del par y/o título y cuerpo del mensaje; luego ocultar el hilo, silenciar notificaciones, mover a carpeta o desterrar al remitente (bloqueo completo).",
+ "subtitle": "Las reglas se aplican en orden. El ámbito elige todos, solo contactos o solo no contactos. Elija subcadena o expresión regular. Gana la primera regla activa que encaje.",
+ "back_tools": "Volver a herramientas",
+ "rules_heading": "Reglas",
+ "add_rule": "Añadir regla",
+ "order_hint": "El orden es de arriba abajo: se aplica la primera regla que coincida.",
+ "empty_rules": "Aún no hay reglas. Añada una o guarde una lista vacía para borrar filtros.",
+ "enabled": "Activada",
+ "move_up": "Subir",
+ "move_down": "Bajar",
+ "remove_rule": "Quitar regla",
+ "terms_label": "Términos o patrones",
+ "terms_placeholder": "Uno por línea o separados por comas. Subcadenas sin distinguir mayúsculas. Regex: un patrón por línea; los inválidos se quitan al guardar.",
+ "match_targets_label": "Coincidir en",
+ "match_peer_fields": "Nombre mostrado del par, nombre propio, datos de contacto",
+ "match_message": "Título y cuerpo del mensaje (si hay)",
+ "match_targets_hint": "Debe quedar al menos un objetivo activo.",
+ "match_mode_label": "Estilo de coincidencia",
+ "match_mode_substring": "Subcadena",
+ "match_mode_regex": "Expresión regular",
+ "scope_label": "Se aplica a",
+ "scope_everyone": "Todos",
+ "scope_contacts": "Solo contactos",
+ "scope_non_contacts": "Solo no contactos",
+ "graph_scope_everyone": "Todos",
+ "graph_scope_contacts": "Contactos",
+ "graph_scope_non_contacts": "No contactos",
+ "graph_match_peer": "par",
+ "graph_match_message": "msg",
+ "graph_match_mode_substring": "subcad.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Entonces",
+ "action_hide": "Ocultar conversación",
+ "action_ignore": "Ignorar (sin notificaciones)",
+ "action_folder": "Mover a carpeta",
+ "action_banish": "Desterrar remitente (bloqueo completo)",
+ "folder_label": "Carpeta",
+ "save": "Guardar",
+ "saving": "Guardando…",
+ "revert": "Recargar",
+ "saved": "Filtros tamiz guardados",
+ "save_failed": "No se pudieron guardar los filtros tamiz",
+ "load_failed": "No se pudieron cargar los filtros tamiz",
+ "flow_heading": "Flujo de reglas",
+ "flow_source": "Pares",
+ "flow_source_hint": "Campos del par: nombre anunciado, su nombre personalizado y contacto o LXMF.",
+ "flow_if": "Si",
+ "flow_hide": "Ocultar",
+ "flow_banish": "Desterrar",
+ "flow_folder": "Carpeta",
+ "flow_no_rules": "Sin reglas"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Flash o actualizar el firmware RNode del navegador (herramienta soportada).",
diff --git a/meshchatx/src/frontend/locales/fr.json b/meshchatx/src/frontend/locales/fr.json
index cf84351e..68c4b00e 100644
--- a/meshchatx/src/frontend/locales/fr.json
+++ b/meshchatx/src/frontend/locales/fr.json
@@ -803,7 +803,7 @@
"clear_cache": "Effacer le cache",
"cache_cleared": "cache de carreaux effacé",
"tile_server_url": "URL du serveur Tile",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Utiliser{z},{x},{y}pour zoom, colonne, ligne",
"tile_server_saved": "URL du serveur Tile enregistrée",
"tile_server_openstreetmap": "OuvrirStreetMap",
@@ -1342,6 +1342,60 @@
"title": "Expéditeur",
"description": "Faire suivre LXMF entre les adresses avec un routage de réponse conservé."
},
+ "sieve_filters": {
+ "title": "Filtres tamis",
+ "description": "Faire correspondre du texte dans les champs du pair et/ou le titre et le corps du message, puis masquer le fil, couper les notifications, déplacer dans un dossier ou bannir l’expéditeur (blocage complet).",
+ "subtitle": "Les règles s’appliquent dans l’ordre. La portée choisit tout le monde, les contacts seulement ou les non-contacts seulement. Sous-chaîne ou expression régulière. La première règle active qui correspond l’emporte.",
+ "back_tools": "Retour aux outils",
+ "rules_heading": "Règles",
+ "add_rule": "Ajouter une règle",
+ "order_hint": "Ordre de haut en bas : la première règle qui correspond s’applique.",
+ "empty_rules": "Aucune règle pour l’instant. Ajoutez-en une ou enregistrez une liste vide pour effacer les filtres.",
+ "enabled": "Activée",
+ "move_up": "Monter",
+ "move_down": "Descendre",
+ "remove_rule": "Supprimer la règle",
+ "terms_label": "Termes ou motifs",
+ "terms_placeholder": "Un par ligne ou séparés par des virgules. Sous-chaînes insensibles à la casse. Regex : un motif par ligne ; les motifs invalides sont retirés à l’enregistrement.",
+ "match_targets_label": "Correspondre dans",
+ "match_peer_fields": "Nom affiché du pair, nom personnalisé, champs contact",
+ "match_message": "Titre et corps du message (si disponibles)",
+ "match_targets_hint": "Au moins une cible doit rester activée.",
+ "match_mode_label": "Mode de correspondance",
+ "match_mode_substring": "Sous-chaîne",
+ "match_mode_regex": "Expression régulière",
+ "scope_label": "S’applique à",
+ "scope_everyone": "Tout le monde",
+ "scope_contacts": "Contacts uniquement",
+ "scope_non_contacts": "Non-contacts uniquement",
+ "graph_scope_everyone": "Tous",
+ "graph_scope_contacts": "Contacts",
+ "graph_scope_non_contacts": "Non-contacts",
+ "graph_match_peer": "pair",
+ "graph_match_message": "msg",
+ "graph_match_mode_substring": "sous-ch.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Alors",
+ "action_hide": "Masquer la conversation",
+ "action_ignore": "Ignorer (pas de notifications)",
+ "action_folder": "Déplacer vers le dossier",
+ "action_banish": "Bannir l’expéditeur (blocage complet)",
+ "folder_label": "Dossier",
+ "save": "Enregistrer",
+ "saving": "Enregistrement…",
+ "revert": "Recharger",
+ "saved": "Filtres tamis enregistrés",
+ "save_failed": "Impossible d’enregistrer les filtres tamis",
+ "load_failed": "Impossible de charger les filtres tamis",
+ "flow_heading": "Flux des règles",
+ "flow_source": "Pairs",
+ "flow_source_hint": "Champs pair : nom annoncé, nom personnalisé, contact ou LXMF.",
+ "flow_if": "Si",
+ "flow_hide": "Masquer",
+ "flow_banish": "Bannir",
+ "flow_folder": "Dossier",
+ "flow_no_rules": "Aucune règle"
+ },
"rnode_flasher": {
"title": "Flasher RNode",
"description": "Flash ou mettre à jour le micrologiciel RNode depuis le navigateur (matériel reconnu).",
diff --git a/meshchatx/src/frontend/locales/it.json b/meshchatx/src/frontend/locales/it.json
index f85f6a13..f0d645b5 100644
--- a/meshchatx/src/frontend/locales/it.json
+++ b/meshchatx/src/frontend/locales/it.json
@@ -855,7 +855,7 @@
"clear_cache": "Svuota Cache",
"cache_cleared": "Cache tile svuotata",
"tile_server_url": "URL Server Tile",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Usa {z}, {x}, {y} per zoom, colonna, riga",
"tile_server_saved": "URL server tile salvato",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1394,6 +1394,60 @@
"title": "Inoltro",
"description": "Inoltra LXMF tra indirizzi mantenendo il routing delle risposte."
},
+ "sieve_filters": {
+ "title": "Filtri a setaccio",
+ "description": "Confronta testo nei campi del peer e/o titolo e corpo del messaggio, poi nascondi la conversazione, silenzia le notifiche, sposta in cartella o bandisci il mittente (blocco completo).",
+ "subtitle": "Le regole sono valide in ordine. L’ambito sceglie tutti, solo contatti o solo non contatti. Sottostringa o espressione regolare. Vince la prima regola attiva che corrisponde.",
+ "back_tools": "Torna agli strumenti",
+ "rules_heading": "Regole",
+ "add_rule": "Aggiungi regola",
+ "order_hint": "Ordine dall’alto in basso: si applica la prima regola che corrisponde.",
+ "empty_rules": "Nessuna regola. Aggiungine una o salva un elenco vuoto per azzerare i filtri.",
+ "enabled": "Attiva",
+ "move_up": "Sposta su",
+ "move_down": "Sposta giù",
+ "remove_rule": "Rimuovi regola",
+ "terms_label": "Termini o pattern",
+ "terms_placeholder": "Uno per riga o separati da virgola. Sottostringhe senza distinzione maiuscole/minuscole. Regex: un pattern per riga; quelli non validi vengono rimossi al salvataggio.",
+ "match_targets_label": "Confronta in",
+ "match_peer_fields": "Nome visualizzato del peer, nome personalizzato, campi contatto",
+ "match_message": "Titolo e corpo del messaggio (se presenti)",
+ "match_targets_hint": "Almeno un obiettivo deve restare attivo.",
+ "match_mode_label": "Modalità di confronto",
+ "match_mode_substring": "Sottostringa",
+ "match_mode_regex": "Espressione regolare",
+ "scope_label": "Si applica a",
+ "scope_everyone": "Tutti",
+ "scope_contacts": "Solo contatti",
+ "scope_non_contacts": "Solo non contatti",
+ "graph_scope_everyone": "Tutti",
+ "graph_scope_contacts": "Contatti",
+ "graph_scope_non_contacts": "Non contatti",
+ "graph_match_peer": "peer",
+ "graph_match_message": "msg",
+ "graph_match_mode_substring": "sottostr.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Allora",
+ "action_hide": "Nascondi conversazione",
+ "action_ignore": "Ignora (senza notifiche)",
+ "action_folder": "Sposta nella cartella",
+ "action_banish": "Bandisci mittente (blocco completo)",
+ "folder_label": "Cartella",
+ "save": "Salva",
+ "saving": "Salvataggio…",
+ "revert": "Ricarica",
+ "saved": "Filtri a setaccio salvati",
+ "save_failed": "Impossibile salvare i filtri a setaccio",
+ "load_failed": "Impossibile caricare i filtri a setaccio",
+ "flow_heading": "Flusso delle regole",
+ "flow_source": "Peer",
+ "flow_source_hint": "Campi peer: nome annunciato, nome personalizzato, contatto o LXMF.",
+ "flow_if": "Se",
+ "flow_hide": "Nascondi",
+ "flow_banish": "Bandisci",
+ "flow_folder": "Cartella",
+ "flow_no_rules": "Nessuna regola"
+ },
"rnode_flasher": {
"title": "Flasher RNode",
"description": "Flash o aggiorna il firmware RNode dal browser (hardware supportato).",
diff --git a/meshchatx/src/frontend/locales/nl.json b/meshchatx/src/frontend/locales/nl.json
index f83176e5..e9c7e4a4 100644
--- a/meshchatx/src/frontend/locales/nl.json
+++ b/meshchatx/src/frontend/locales/nl.json
@@ -803,7 +803,7 @@
"clear_cache": "Cache wissen",
"cache_cleared": "Tegel cache gewist",
"tile_server_url": "Tegelserver-URL",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "{z},{x},{y}gebruiken voor zoom, kolom, rij",
"tile_server_saved": "Tegelserver-URL opgeslagen",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1342,6 +1342,60 @@
"title": "Stuurprogramma",
"description": "Doorsturen LXMF tussen adressen met antwoord routing behouden."
},
+ "sieve_filters": {
+ "title": "Zeeffilters",
+ "description": "Tekst in peer-velden en/of berichttitel en -inhoud matchen; gesprek verbergen, geen meldingen, naar map verplaatsen of afzender verbannen (volledige blokkade).",
+ "subtitle": "Regels worden in volgorde toegepast. Bereik kiest iedereen, alleen contacten of alleen niet-contacten. Deelstring of regex. De eerste actieve regel die past, wint.",
+ "back_tools": "Terug naar gereedschap",
+ "rules_heading": "Regels",
+ "add_rule": "Regel toevoegen",
+ "order_hint": "Volgorde van boven naar beneden: de eerste passende regel geldt.",
+ "empty_rules": "Nog geen regels. Voeg een regel toe of sla een lege lijst op om filters te wissen.",
+ "enabled": "Ingeschakeld",
+ "move_up": "Omhoog",
+ "move_down": "Omlaag",
+ "remove_rule": "Regel verwijderen",
+ "terms_label": "Termen of patronen",
+ "terms_placeholder": "Eén per regel of komma-gescheiden. Deelstrings zijn hoofdletterongevoelig. Regex: één patroon per regel; ongeldige patronen worden bij opslaan verwijderd.",
+ "match_targets_label": "Matchen in",
+ "match_peer_fields": "Peer-weergavenaam, eigen naam, contactvelden",
+ "match_message": "Berichttitel en -inhoud (indien beschikbaar)",
+ "match_targets_hint": "Minstens één doel moet aan blijven staan.",
+ "match_mode_label": "Matchstijl",
+ "match_mode_substring": "Deelstring",
+ "match_mode_regex": "Reguliere expressie",
+ "scope_label": "Geldt voor",
+ "scope_everyone": "Iedereen",
+ "scope_contacts": "Alleen contacten",
+ "scope_non_contacts": "Alleen niet-contacten",
+ "graph_scope_everyone": "Iedereen",
+ "graph_scope_contacts": "Contacten",
+ "graph_scope_non_contacts": "Geen contact",
+ "graph_match_peer": "peer",
+ "graph_match_message": "msg",
+ "graph_match_mode_substring": "deelstr.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Dan",
+ "action_hide": "Gesprek verbergen",
+ "action_ignore": "Negeren (geen meldingen)",
+ "action_folder": "Verplaatsen naar map",
+ "action_banish": "Afzender verbannen (volledige blokkade)",
+ "folder_label": "Map",
+ "save": "Opslaan",
+ "saving": "Opslaan…",
+ "revert": "Herladen",
+ "saved": "Zeeffilters opgeslagen",
+ "save_failed": "Zeeffilters opslaan mislukt",
+ "load_failed": "Zeeffilters laden mislukt",
+ "flow_heading": "Regelstroom",
+ "flow_source": "Peers",
+ "flow_source_hint": "Peer-velden: aangekondigde naam, uw naam, contact of LXMF.",
+ "flow_if": "Als",
+ "flow_hide": "Verbergen",
+ "flow_banish": "Verbannen",
+ "flow_folder": "Map",
+ "flow_no_rules": "Geen regels"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Flash of update RNode firmware van de browser (ondersteunde hardware).",
diff --git a/meshchatx/src/frontend/locales/ru.json b/meshchatx/src/frontend/locales/ru.json
index 041f0bdc..04ec61dd 100644
--- a/meshchatx/src/frontend/locales/ru.json
+++ b/meshchatx/src/frontend/locales/ru.json
@@ -855,7 +855,7 @@
"clear_cache": "Очистить кэш",
"cache_cleared": "Кэш тайлов очищен",
"tile_server_url": "URL сервера тайлов",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "Используйте {z}, {x}, {y} для масштаба, столбца, строки",
"tile_server_saved": "URL сервера тайлов сохранен",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1282,6 +1282,60 @@
"title": "Forwarder",
"description": "Пересылка LXMF между адресами с сохранением маршрута ответов."
},
+ "sieve_filters": {
+ "title": "Сито-фильтры",
+ "description": "Сопоставлять текст в полях пира и/или заголовке и теле сообщения, затем скрыть беседу, отключить уведомления, переместить в папку или изгнать отправителя (полная блокировка).",
+ "subtitle": "Правила применяются по порядку. Область задаёт всех, только контактов или только не контактов. Подстрока или регулярное выражение. Срабатывает первое включённое подходящее правило.",
+ "back_tools": "Назад к инструментам",
+ "rules_heading": "Правила",
+ "add_rule": "Добавить правило",
+ "order_hint": "Сверху вниз: применяется первое подходящее правило.",
+ "empty_rules": "Правил пока нет. Добавьте правило или сохраните пустой список, чтобы сбросить фильтры.",
+ "enabled": "Включено",
+ "move_up": "Вверх",
+ "move_down": "Вниз",
+ "remove_rule": "Удалить правило",
+ "terms_label": "Термины или шаблоны",
+ "terms_placeholder": "По одному в строке или через запятую. Подстроки без учёта регистра. Regex: один шаблон на строку; неверные шаблоны удаляются при сохранении.",
+ "match_targets_label": "Где искать",
+ "match_peer_fields": "Отображаемое имя пира, своё имя, поля контакта",
+ "match_message": "Заголовок и тело сообщения (если есть)",
+ "match_targets_hint": "Хотя бы одна цель должна оставаться включённой.",
+ "match_mode_label": "Способ сопоставления",
+ "match_mode_substring": "Подстрока",
+ "match_mode_regex": "Регулярное выражение",
+ "scope_label": "Действует для",
+ "scope_everyone": "Всех",
+ "scope_contacts": "Только контактов",
+ "scope_non_contacts": "Только не контактов",
+ "graph_scope_everyone": "Все",
+ "graph_scope_contacts": "Контакты",
+ "graph_scope_non_contacts": "Не контакты",
+ "graph_match_peer": "пир",
+ "graph_match_message": "сообщ.",
+ "graph_match_mode_substring": "подстр.",
+ "graph_match_mode_regex": "regex",
+ "action_label": "Тогда",
+ "action_hide": "Скрыть беседу",
+ "action_ignore": "Игнорировать (без уведомлений)",
+ "action_folder": "Переместить в папку",
+ "action_banish": "Изгнать отправителя (полная блокировка)",
+ "folder_label": "Папка",
+ "save": "Сохранить",
+ "saving": "Сохранение…",
+ "revert": "Перезагрузить",
+ "saved": "Сито-фильтры сохранены",
+ "save_failed": "Не удалось сохранить сито-фильтры",
+ "load_failed": "Не удалось загрузить сито-фильтры",
+ "flow_heading": "Схема правил",
+ "flow_source": "Пиры",
+ "flow_source_hint": "Поля пира: объявленное имя, ваше имя, контакт или LXMF.",
+ "flow_if": "Если",
+ "flow_hide": "Скрыть",
+ "flow_banish": "Изгнать",
+ "flow_folder": "Папка",
+ "flow_no_rules": "Нет правил"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Прошивка или обновление RNode из браузера (поддерживаемое оборудование).",
diff --git a/meshchatx/src/frontend/locales/zh.json b/meshchatx/src/frontend/locales/zh.json
index 04b12ee4..131b0b4b 100644
--- a/meshchatx/src/frontend/locales/zh.json
+++ b/meshchatx/src/frontend/locales/zh.json
@@ -803,7 +803,7 @@
"clear_cache": "清除缓存",
"cache_cleared": "瓦片缓存已清除",
"tile_server_url": "瓦片服务器 URL",
- "tile_server_url_placeholder": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "tile_server_url_placeholder": "https://tiles.openfreemap.org/styles/bright",
"tile_server_url_hint": "使用 {z}、{x}、{y} 表示缩放、列、行",
"tile_server_saved": "瓦片服务器 URL 已保存",
"tile_server_openstreetmap": "OpenStreetMap",
@@ -1342,6 +1342,60 @@
"title": "转发器",
"description": "在地址之间转发 LXMF, 并保留回执路径 。"
},
+ "sieve_filters": {
+ "title": "筛选规则",
+ "description": "在对等方字段和/或消息标题与正文中匹配文本,然后隐藏会话、关闭通知、移入文件夹或放逐发送方(完全屏蔽)。",
+ "subtitle": "规则按顺序执行。适用范围可选所有人、仅联系人或仅非联系人。可选子串或正则。第一条匹配且已启用的规则生效。",
+ "back_tools": "返回工具",
+ "rules_heading": "规则",
+ "add_rule": "添加规则",
+ "order_hint": "自上而下:先匹配的规则优先。",
+ "empty_rules": "尚无规则。添加规则或保存空列表以清除筛选。",
+ "enabled": "启用",
+ "move_up": "上移",
+ "move_down": "下移",
+ "remove_rule": "删除规则",
+ "terms_label": "词或模式",
+ "terms_placeholder": "每行一个或用逗号分隔。子串不区分大小写。正则每行一条;无效模式在保存时移除。",
+ "match_targets_label": "匹配范围",
+ "match_peer_fields": "对等方显示名、自定义名、联系人字段",
+ "match_message": "消息标题与正文(若有)",
+ "match_targets_hint": "至少保留一个匹配目标。",
+ "match_mode_label": "匹配方式",
+ "match_mode_substring": "子串",
+ "match_mode_regex": "正则表达式",
+ "scope_label": "适用于",
+ "scope_everyone": "所有人",
+ "scope_contacts": "仅联系人",
+ "scope_non_contacts": "仅非联系人",
+ "graph_scope_everyone": "所有人",
+ "graph_scope_contacts": "联系人",
+ "graph_scope_non_contacts": "非联系人",
+ "graph_match_peer": "对等方",
+ "graph_match_message": "消息",
+ "graph_match_mode_substring": "子串",
+ "graph_match_mode_regex": "正则",
+ "action_label": "则",
+ "action_hide": "隐藏会话",
+ "action_ignore": "忽略(无通知)",
+ "action_folder": "移入文件夹",
+ "action_banish": "放逐发送方(完全屏蔽)",
+ "folder_label": "文件夹",
+ "save": "保存",
+ "saving": "正在保存…",
+ "revert": "重新加载",
+ "saved": "筛选规则已保存",
+ "save_failed": "无法保存筛选规则",
+ "load_failed": "无法加载筛选规则",
+ "flow_heading": "规则流程",
+ "flow_source": "对等方",
+ "flow_source_hint": "对等方字段:广播显示名、自定义名、联系人或 LXMF。",
+ "flow_if": "若",
+ "flow_hide": "隐藏",
+ "flow_banish": "放逐",
+ "flow_folder": "文件夹",
+ "flow_no_rules": "无规则"
+ },
"rnode_flasher": {
"title": "R 节点闪光器",
"description": "从浏览器(支持的硬件)中闪出或更新RNode固件.",
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────